// RT-Thread头文件
#include <rtthread.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include <rtdevice.h>
#include <board.h>

// HAL库头文件
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "rt_thread_demo.h"
#include "../hardware/RGB/rgb_pwm.h"             // RGB

uint8_t hal_tim4_pwm_flag = 1;

/****************************** RGB_PWM_Init BEGIN *****************************
 * 函    数：RGB_PWM_Init
 * 功    能：初始化TIM4的三路PWM输出（RGB灯）
 *           包括TIM4的GPIO和TIM4的PWM配置
 * 参    数：无
 *           TIM4的GPIO配置为PD12(CH1) ，PD13(CH2) , PD14(CH3)
 * 返 回 值：无
 * 注意事项：无
 ******************************************************************************/
void RGB_PWM_Init(void)
{
    MX_TIM4_Init(); // TIM4 三路PWM初始化
    HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); // 使能TIM4的PWM Channel1 输出
    HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);
    if(hal_tim4_pwm_flag) fly_control_init_status |= 0b10000000; // 成功标志位
}
/****************************** RGB_PWM_Init END *******************************/

/****************************** RGB_PWM_SetColor BEGIN *************************
 * 函    数：RGB_PWM_SetColor
 * 功    能：设置RGB灯的颜色（通过PWM占空比）
 * 参    数：
 *       red   ：红色通道PWM值（0~255或0~最大PWM值）
 *       green ：绿色通道PWM值
 *       blue  ：蓝色通道PWM值
 * 返 回 值：无
 * 注意事项：根据实际PWM分辨率调整输入范围
 ******************************************************************************/
void RGB_PWM_SetColor(uint8_t red, uint8_t blue, uint8_t green)
{
    red = (float)red/255.0 * 2000;   // 将0~255范围映射到0~2000us
    green = (float)green/255.0 * 2000; // 将0~255范围映射到0~2000us
    blue = (float)blue/255.0 * 2000;   // 将0~255范围映射到0~2000us
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, red);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_2, blue);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, green);
}
/****************************** RGB_SET END ***************************/

/****************************** RGB_SET BEGIN *************************
 * 函    数：RGB_SET
 * 功    能：设置RGB灯的颜色（通过预定义颜色宏）
 * 参    数：
 *       color ：预定义颜色宏（如RGB_COLOR_RED, RGB_COLOR_GREEN等）
 * 返 回 值：无
 * 注意事项：使用预定义颜色宏简化颜色设置
 ******************************************************************************/
void RGB_SET(uint8_t color)
{
    switch(color)
    {
        case RGB_COLOR_RED:
            RGB_PWM_SetColor(255, 0, 0);
            break;
        case RGB_COLOR_GREEN:
            RGB_PWM_SetColor(0, 255, 0);
            break;
        case RGB_COLOR_BLUE:
            RGB_PWM_SetColor(0, 0, 255);
            break;
        case RGB_COLOR_YELLOW:
            RGB_PWM_SetColor(255, 255, 0);
            break;
        case RGB_COLOR_CYAN:
            RGB_PWM_SetColor(0, 255, 255);
            break;
        case RGB_COLOR_MAGENTA:
            RGB_PWM_SetColor(255, 0, 255);
            break;
        case RGB_COLOR_WHITE:
            RGB_PWM_SetColor(255, 255, 255);
            break;
        case RGB_COLOR_OFF:
        default:
            RGB_PWM_SetColor(0, 0, 0);
            break;
    }
}
/****************************** RGB_SET END ***************************/
